//
//  UIViewController+BaseBaseBusiness.h
//  LBBase
//
//  Created by Gary on 15/9/13

//  Copyright (c) 2015年 Lebo. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "UIView+BaseBusiness.h"

//Submit Button的参数
#define kSubmitButtonFrame                      MakeRect(kSubviewMarginHorizontal, 0, ScreenWidth - 2 * kSubviewMarginHorizontal, kTableCellHeight)
static const float kSubmitButtonCornerRadius    = 5.f;
#define kSubmitButtonTextColor                  [UIColor whiteColor]
#define kSubmitButtonTextColorHighlighted       [UIColor grayColor]
//#define kSubmitButtonTextColorUnable          [UIColor lightGrayColor]
#define kSubmitButtonBGColor                    MakeColor(17.f, 79.f, 192.f)
#define kSubmitButtonBGColorUnable              MakeColor(116.f, 172.f, 226.f)

/**
 *  引入该扩展务必保证UIViewController实现以下protocol，否则将会不可名状的错误
 *  BusinessListenerProtocol
 *  BaseBussinissProtocol
 */
@interface UIViewController (BaseBusiness)

- (void)performViewDidLoad;

#pragma mark - Navigation Bar

/**
 *  设置NavigationBar
 */
- (void)initNavigationBar;

/**
 *  设置默认的NavigationBar
 */
- (void)defaultNavigationLeftBar;

- (void)setNavigationLeftBar:(NSMutableDictionary*)leftDic;
- (void)setNavigationRightBar:(NSMutableDictionary*)rightDic;

/*
 * 设置Navigation Bar的样式
 * 入参left和right:
 * 参数类型为NSString*时，将直接设置左边和右边按钮的标题
 * 参数类型为UIImage*时，将设置左边和右边按钮的图片
 * 参数类型为NSDictionary*时，将按照如下形式读取，在设置参数时也按照此形式设置
 * {
 *     "style" : "text" or "image" or "customer",
 *     "title" : NSSring*,
 *     "images" : UIImage* or NSDictionary*
 *     "action" : NSValue with @selector or block
 * }
 */
- (void)setNavigationBar:(NSString*)title left:(id)left right:(id)right;

/**
 *  为Navigation Bar Button Item添加Badg（红点）
 *
 *  @param barButtonItem 需要添加的导航栏左右按钮
 */
- (void)addNavigationBarButtonItemBadge:(UIBarButtonItem *)barButtonItem;

#pragma mark - Page Style

/**
 *  当前页面是否在最上层（不包括modal出来的页面）
 *
 *  @return
 */
- (BOOL)isPresent;
//- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;

/**
 *  页面返回
 */
- (void)pageBack;

/**
 *  跳转到指定的页面
 *
 *  @param viewController 目标页面
 *  @param animated       是否以动画的方式跳转
 */
- (void)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;

/**
 *  跳转到指定类的页面
 *
 *  @param viewControllerClass 目标页面的类
 *  @param animated            是否以动画的方式跳转
 *
 *  @return 返回为nil的话，表示前面页面中没有该类的页面
 */
- (UIViewController*)popToViewControllerKindClass:(id)viewControllerClass animated:(BOOL)animated;

/**
 *  跳转到指定类及子类的页面
 *
 *  @param viewControllerClass 目标页面的父类
 *  @param animated            是否以动画的方式跳转
 *
 *  @return 返回为nil的话，表示前面页面中没有该类和子类的页面
 */
- (UIViewController*)popToViewControllerMemberClass:(id)viewControllerClass animated:(BOOL)animated;

/**
 *  退出页面
 *  会做退出监听列表的操作，这个操作很重要，不做的话会引起内存泄露
 *
 *  @param animated 是否以动画的方式跳转
 */
- (void)popViewControllerAnimated:(BOOL)animated;

#pragma mark - Bussiniss Listener

- (void)registerBusinessListener;
- (void)unregisterBusinessListener;

- (void)onBusinessNotify:(NSUInteger)notifyID inParam:(id)inParam;

#pragma mark - Network Request & Response

/**
 *  获取请求参数的NSMutableDictionary
 *
 *  @param paramDic 额外的请求参数
 *
 *  @return 请求参数的NSMutableDictionary，该字典不用于设置返回时带用户标记的requestInfo，例如loadType等
 */
- (NSMutableDictionary*)requestDic:(NSDictionary*)paramDic;

/**
 *  获取发往Businiss Framework的网络请求参数
 *
 *  @param requestDic  网络请求参数
 *  @param requestInfo 用户标记参数，用来在返回时确定发送者信息
 *
 *  @return 发往Businiss Framework的网络请求参数
 */
- (NSDictionary*)makeRequestParams:(NSMutableDictionary*)requestDic requestInfo:(NSDictionary*)requestInfo;

/**
 *  判断该网络请求是否是从本页面发出的
 *
 *  @param BOOL 用户标记参数，用来在返回时确定发送者信息
 *
 *  @return
 */
- (BOOL)isSender:(NSDictionary*)requestInfo;

/**
 *  由于断网、超时等引起的网络，在此重写该函数，以便做处理
 *
 *  @return YES: 页面有特定的处理，NO: 将会默认弹出网络页面到self.view上
 */
- (BOOL)networkRequestFailed:(NSError*)error;

#pragma mark - Common Features

/**
 *  获得一个提交样式的按钮
 *
 *  @return 按钮
 */
- (UIButton *)submitButton:(NSString *)title;

/**
 *  更改提交按钮在可点击和不可点击状态的样式
 *
 *  @param button  按钮
 *  @param enabled YES:按钮将会变成可点击 NO:按钮将会变成不可点击
 */
- (void)changeSubmitButton:(UIButton*)button enabled:(BOOL)enabled;

/**
 *  进入加载纯网页的页面
 *
 *  @param title 页面标题
 *  @param url   网页url
 */
- (void)showWebPage:(NSString *)title url:(NSURL *)url;

@end
